複習一下上一篇「30 天精通 Git 版本控管 (03):建立儲存庫」的內容,我們直接來建立一個本地儲存庫,即可開始本篇文章的所有練習。
mkdir git-demo
cd git-demo
git init
我們在工作目錄下放一些檔案,至於放什麼檔案都可以,總之先複製一些現有的檔案與目錄進到目前的工作目錄下。
本篇文章,我將以 YEOMAN 工具,快速產生一個 webapp 範例網站,只要一個指令就可以建立一個完整網站:
yo webapp
註: 關於 YEOMAN 在 Windows 平台的使用,可以參考筆者的文章 如何在 Windows 平台安裝與使用 Yeoman 1.0 相關工具,該文詳述完整的安裝與使用過程。
新增了檔案之後,如果你還在 Git Shell 介面下,應該會立刻看到如下圖的提示:
也就是以下這段位於路徑後面的提示:
[master +10 ~0 -0 !]
在這段提示的地方,你可以看到幾個東西:
* master 代表目前工作目錄是 master 分支,也是 Git 的預設分支名稱。
* 「紅色」的數字都代表 Untracked (未追蹤) 的檔案,也就是這些變更都不會進入版本控管。
* +10 代表有 10 個「新增」的檔案
* ~0 代表有 0 個「修改」的檔案
* -0 代表有 0 個「刪除」的檔案
如果要要將這些新增的檔案加入到 Git 版本控管,你必須下達以下指令:
git add .
如此一來,這個工作目錄下所有的檔案、目錄與子目錄下的所有檔案,全部都會被加入到這個 Git 工作目錄的【索引】或【快取】之中。請注意: 此時並沒有建立任何版本,只是告知 Git 這些檔案「即將」被加入 Git 版本庫而已。
如下圖示,是我這邊執行完 git add . 之後的結果,這裡所發生的 warning 訊息不是很嚴重,有興趣了解的人可以參考筆者的另一篇文章: Git 在 Windows 平台處理斷行字元 (CRLF) 的注意事項。
不過有趣的地方在於,原本「紅色的數字」現在卻變成了「綠色的數字」,這裡所代表的意義是:
* 「綠色」的數字都代表 Staged (準備好) 的檔案,也就是這些變更才會進入版本控管。
* +23 代表有 23 個「新增」的檔案將被建立一個版本
* ~0 代表有 0 個「修改」的檔案將被建立一個版本
* -0 代表有 0 個「刪除」的檔案將被建立一個版本
但原本不是只有 +10 (紅色) 而已嗎? 怎麼執行完後變成了 +23 (綠色) 呢?
我們執行 git reset 重設一下工作目錄的索引狀態,然後再執行一次 git status 查詢當前工作目錄的詳細狀態,如下圖示:
你可以發現,這邊列出的只有「第一層目錄下的檔案與目錄」而已,因為 git 不會這個時候去查到底目錄下到底有多少檔案沒有被追蹤。
當我們執行 git add . 之後,再執行一次 git status 查詢狀態,你可以發現連子目錄下的檔案也都全部被加入了,所以這個數字才會變多,如下圖示:
剛剛提到的 git add . 指令會自動將所有檔案(含子目錄的檔案)加入到工作目錄索引中,有時候我們只想讓特定目錄或特定檔案加入版本,這時你也可以指定特定目錄,或利用萬用字元來加入檔案。
我們再執行一次 git reset 重設工作目錄的索引狀態,然後用 git add app 加入 app 這個資料夾與其下的所有檔案,還有用 git add .* 新增所有「點」開頭的檔案,如下圖示:
在執行的過程中,你應該可以發現,在執行 git add 的過程中,Git Shell 提示的文字也有了些變化,現在同時出現了「綠色的數字」與「紅色的數字」,所代表的意思跟上述是一樣的,是不是非常方便辨識!當你需要知道詳情才需要執行 git status 指令。
註: 詳細的指令與參數說明,可以輸入 git help add 查詢完整的文件。
這時我們預計要建立一個新版本了,在建立版本之前,我們還是把所有檔案給加入吧,請各位在執行一次 git add . 命令。
建立版本的指令如下:
git commit
git commit -m "版本紀錄的說明文字"
在 Git 版本控管中,所有的版本都必須擁有「版本紀錄的說明文字」 ( 簡稱 Log ),不像 Subversion 預設可以簽入「沒有版本紀錄說明」的版本。所以當你直接輸入 git commit 的話,預設會開啟 Notepad (記事本) 讓你輸入這個版本的訊息。開啟後的檔案會有很多 # 符號開頭的文字,這些都是註解,不會成為 Log 的一部分。
如下圖示,是我輸入的訊息文字:
當你按下 Ctrl+S 儲存這個文字檔,這時還不會建立一個新版本,還必須關閉這個 Notepad 視窗,這時才會正式建立版本,如下圖示:
建立版本完後,Git Shell 的提示就只剩下 [master] 字樣了,代表目前已經沒有任何要被建立版本的索引或快取。
註: 詳細的指令與參數說明,可以輸入 git help commit 查詢完整的文件。
由於我們剛剛建立了一個版本,當我們想要查詢版本的歷史紀錄,可以輸入以下指令:
git log
有時候紀錄越來越多,你也可以透過以下指令限制輸出的版本數量,你只要透過一個減號 ( - ) 與一個數字,就可以限定輸出最近幾筆紀錄:
git log -10
註: 詳細的指令與參數說明,可以輸入 git help log 查詢完整的文件。
在 Git 指令列工具中也有個 rm 指令,可以用來刪除檔案。例如我們想刪除 Gruntfile.js 這個檔案,可以輸入以下指令:
git rm 'Gruntfile.js'
這個 git rm 的指令執行的時候,會同時做兩件事:
註: 詳細的指令與參數說明,可以輸入 git help rm 查詢完整的文件。
在 Git 指令列工具中也有個 mv 指令,可以用來變更檔案或目錄的名稱。例如我們想把 test 目錄更名為 unit-test 名稱,可以輸入以下指令:
git mv test unit-test
註: 詳細的指令與參數說明,可以輸入 git help mv 查詢完整的文件。
剛剛我們一直會看到 git status 來顯示工作目錄的狀態,你也可以使用 git status -s 來顯示較為精簡的版本。
註: 詳細的指令與參數說明,可以輸入 git help status 查詢完整的文件。
我們曾經學過如何利用 git reset 重置目前工作目錄的索引狀態,但請注意,這個指令預設只會重置「索引狀態」,那些你用 git rm 刪除的目錄或檔案,還是用 git mv 更名的目錄或檔案,透過 git reset 都無法把「實體檔案」給救回來。
如果想把工作目錄也給還原到目前的最新版,則必須輸入以下指令:
git reset --hard
註: 詳細的指令與參數說明,可以輸入 git help reset 查詢完整的文件。
如果檔案編輯到一半,發現被改壞了,你希望能救回改沒修改前的版本,這時你可以利用以下指令還原檔案:
git checkout master Gruntfile.js
這段指令的意思是把 master 分支中最新版的 Grunefile.js 給還原,由於我先前已經把 Gruntfile.js 給刪除了,為了要救回這一個檔,可以用這個方式救回。這樣可以避免使用 git reset --hard 一次把所有檔案都給還原了!
請注意,還原的過程也會一併復原工作目錄的索引狀態喔!
註: 詳細的指令與參數說明,可以輸入 git help checkout 查詢完整的文件。
今日的文章,可以說是在 Git 版本控管中不斷會重複使用的指令與參數,必須非常熟練才行,接下來的文章,將會詳細探討 Git 版本控管的內部結構,千萬不要錯過!
我重新整理一下本日學到的 Git 指令與參數:
* git init
* git add .
* git add app/*
* git add *.txt
* git status
* git status -s
* git commit
* git commit -m "版本紀錄的說明文字"
* git log
* git log -10
* git rm '*.txt'
* git rm 'app/*.html'
* git mv 'oldname' 'newname'
* git reset
* git reset --hard
* git checkout master 'filename'
請教一下,git目前若檔案中存在太多二進制的文件,有時會有點LAG,效率非常不好。
我依然想保留這些文件於server中,並不想要略過,不知這部份是否有解?
太多是有多少?